package mybox.engine.servo;

import mybox.engine.Circle;
import mybox.engine.Figur;
import mybox.engine.File4Qcad;
import mybox.engine.QVector;
import mybox.engine.SchachtelExt;

public class ServoKorpusOO implements Figur{

	public static final String intoGrundplatte ="intoGrundPlatte";
	public static final String intoLaengenPlatte ="intoLaengenPlatte";
	File4Qcad file4qcad;
	double laserBreite;
	double materialDicke;
	QVector lowerLeftHole;
	QVector upperLeftHole;
	QVector upperRightHole;
	QVector lowerRightHole;
	QVector center;
	
	QVector lowerLeftEcke;
	QVector lowerRightEcke;
	QVector rudderCenter;
	public QVector gegenAchseCenter;
	public double  gegenAchseRadius;
	
	double langSeiteLochDistance;
	double kurzSeiteLochDistance;
	double lochRadius;
	
	double korpusLaenge;
	double korpusLaengeOhneNase;
	double korpusBreite;
	
	double rudderBefestLochDm;
	double rudderBefestLochRadius;
	
	double rudderZyl2Back;
	double rudderZyl0;
	
	double servoUnterBefestigung;
	
	public double servoProtruding; //soviel wie der Servo rausschaut, nach Montage (mit Rudder)
	
	double abstand2BoxInnenWand;
	double boxInnenLaenge;
	double boxInnenBreite;
	double boxInnenHoehe;
	
	public double diagFromRudderCenter;
	double diagSpace;
	
	
	
	public ServoKorpusOO(File4Qcad file4qcad, String type, double materialDicke, double laserBreite) {
		
		this.file4qcad=file4qcad;
		this.laserBreite=laserBreite;
		this.materialDicke=materialDicke;
		if (type.equalsIgnoreCase(Servo.S3111)) {
			
			langSeiteLochDistance=43.5;
			kurzSeiteLochDistance=5.75;
			lochRadius=2;      //Servo-Befestigungsloecher am Korpus
			korpusLaenge=41.6; //inklusive DrahtanschlussNase
			
			//Zum rudderCenter Testen:
			//korpusLaenge=40; 
			
			korpusLaengeOhneNase=40; //inklusive DrahtanschlussNase
			korpusBreite=20;
			
			servoUnterBefestigung=26.5;
			
			abstand2BoxInnenWand=4;
			boxInnenLaenge=langSeiteLochDistance+4*lochRadius+2*abstand2BoxInnenWand;
			boxInnenBreite=korpusBreite+2*abstand2BoxInnenWand;
			boxInnenHoehe=servoUnterBefestigung+Servo.fingerRaum;
									
			rudderZyl2Back=27.6;
			rudderZyl0=5.65;		
			servoProtruding=16.7;				
			
		}
		
	}
	
	public void positionIntoServoBox(SchachtelExt servoBox, String plattenTyp) {
		
		
		QVector platte1Ecke0=null;
		QVector platte1Center=null;
		QVector platte2Ecke0=null;
		if (plattenTyp.equalsIgnoreCase(ServoKorpus.intoGrundplatte)) {			
			platte1Ecke0=servoBox.platteOODP.ecke[0];
			platte1Center=servoBox.platteOODP.center;
			platte2Ecke0=servoBox.platteOOGP.ecke[0];	
			lowerLeftHole = new QVector(
					 platte1Ecke0.x+materialDicke+abstand2BoxInnenWand+lochRadius,
					 platte1Center.y-(kurzSeiteLochDistance)/2-lochRadius
			  );
		}
		
		if (plattenTyp.equalsIgnoreCase(ServoKorpus.intoLaengenPlatte)) {
			platte1Ecke0=servoBox.laengenPlatteVorne.ecke[0];
			platte1Center=servoBox.laengenPlatteVorne.center;
			platte2Ecke0=servoBox.laengenPlatteHinten.ecke[0];
			lowerLeftHole = new QVector(
					 platte1Ecke0.x+materialDicke+abstand2BoxInnenWand+lochRadius,
					 platte1Center.y-(kurzSeiteLochDistance)/2-lochRadius
			  );
		}
		
		 
		 
		 
		   
		 upperLeftHole = new QVector(lowerLeftHole.x, lowerLeftHole.y+kurzSeiteLochDistance+2*lochRadius);
		 upperRightHole = new QVector(upperLeftHole.x+langSeiteLochDistance+2*lochRadius, upperLeftHole.y);
		 lowerRightHole = new QVector(lowerLeftHole.x+langSeiteLochDistance+2*lochRadius, lowerLeftHole.y);
		 center = new QVector((lowerLeftHole.x+lowerRightHole.x)/2,
		                         (lowerLeftHole.y+upperLeftHole.y)/2
		                        );
		 
		 lowerLeftEcke = new QVector(center.x-korpusLaengeOhneNase/2,center.y-(korpusBreite/2));
		 lowerRightEcke = new QVector(center.x+korpusLaengeOhneNase/2,center.y-(korpusBreite/2));
	   	  
   	  
		 rudderCenter = new QVector(lowerRightEcke.x-rudderZyl2Back-(rudderZyl0/2),lowerRightEcke.y+(korpusBreite/2));
			
		  QVector rC2servoBox = new QVector(rudderCenter.x-platte1Ecke0.x,
					                          rudderCenter.y-platte1Ecke0.y);
			double rudderCenter2Front=platte1Ecke0.x-rudderCenter.x;
			double halbePlatte=center.y-platte1Ecke0.y; 
			if (plattenTyp.equalsIgnoreCase(ServoKorpus.intoLaengenPlatte)) {
				rudderCenter2Front+=servoBox.materialDicke;
				halbePlatte+=servoBox.materialDicke;
			}
				
			diagFromRudderCenter=java.lang.Math.sqrt(rudderCenter2Front*rudderCenter2Front+halbePlatte*halbePlatte);
					
			
			
			gegenAchseCenter = new QVector(					
					platte2Ecke0.x+rC2servoBox.x,
					platte2Ecke0.y+rC2servoBox.y
					);
			
			gegenAchseRadius=2.45-2*laserBreite; 
			diagSpace=gegenAchseRadius;
		
	}
	
	public void draw() {
		
		new Circle(file4qcad, lowerLeftHole, lochRadius).draw();  
    	new Circle(file4qcad, upperLeftHole, lochRadius).draw();
    	new Circle(file4qcad, upperRightHole, lochRadius).draw();
    	new Circle(file4qcad, lowerRightHole, lochRadius).draw();
    	
    	
    	QVector lowerLeftRectPos = new QVector(center.x-korpusLaenge/2, center.y-korpusBreite/2);
    	QVector upperLeftRectPos = new QVector(center.x-korpusLaenge/2, center.y+korpusBreite/2);
    	QVector lowerRighthtRectPos = new QVector(center.x+korpusLaenge/2, center.y-korpusBreite/2);
    	
    	QVector vertikale = new QVector(0,korpusBreite);
    	QVector horizontale = new QVector(korpusLaenge,0);
    	
    	file4qcad.println(vertikale.printLineAktPosNeutral(lowerLeftRectPos));
    	file4qcad.println(horizontale.printLineAktPosNeutral(lowerLeftRectPos));
    	file4qcad.println(horizontale.printLineAktPosNeutral(upperLeftRectPos));
    	file4qcad.println(vertikale.printLineAktPosNeutral(lowerRighthtRectPos));
    
		
	}
	
	public void drawRudderHoleAtBox(ServoRudder rudder) {
    	new Circle(file4qcad,rudderCenter,rudder.mm0/2).draw();    	
    }
    
    public void drawGegenAchse() {
    	new Circle(file4qcad,gegenAchseCenter,gegenAchseRadius).draw();
    }

}
